#!/usr/bin/env node

/**
 * 版本号自动递增脚本
 * 在构建前自动递增package.json中的版本号
 */

const fs = require('fs');
const path = require('path');

/**
 * 递增版本号
 * @param {string} version 当前版本号
 * @param {string} type 递增类型 (patch, minor, major)
 * @returns {string} 新版本号
 */
function bumpVersion(version, type = 'patch') {
  const parts = version.split('.').map(Number);
  
  switch (type) {
    case 'major':
      parts[0]++;
      parts[1] = 0;
      parts[2] = 0;
      break;
    case 'minor':
      parts[1]++;
      parts[2] = 0;
      break;
    case 'patch':
    default:
      parts[2]++;
      break;
  }
  
  return parts.join('.');
}

/**
 * 更新package.json中的版本号
 * @param {string} newVersion 新版本号
 * @returns {boolean} 是否更新成功
 */
function updatePackageVersion(newVersion) {
  try {
    const packagePath = path.join(__dirname, '../package.json');
    const packageData = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
    
    const oldVersion = packageData.version;
    packageData.version = newVersion;
    
    // 写入文件
    fs.writeFileSync(packagePath, JSON.stringify(packageData, null, 2) + '\n');
    
    console.log(`✅ 版本号已更新: ${oldVersion} → ${newVersion}`);
    return true;
  } catch (error) {
    console.error('❌ 更新版本号失败:', error.message);
    return false;
  }
}

/**
 * 获取当前版本号
 * @returns {string} 当前版本号
 */
function getCurrentVersion() {
  try {
    const packagePath = path.join(__dirname, '../package.json');
    const packageData = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
    return packageData.version;
  } catch (error) {
    console.error('读取版本号失败:', error.message);
    return '1.0.0';
  }
}

/**
 * 主函数
 */
function main() {
  const args = process.argv.slice(2);
  const type = args[0] || 'patch';
  
  if (!['patch', 'minor', 'major'].includes(type)) {
    console.error('❌ 无效的版本类型，请使用: patch, minor, 或 major');
    process.exit(1);
  }
  
  const currentVersion = getCurrentVersion();
  const newVersion = bumpVersion(currentVersion, type);
  
  console.log(`🔄 准备更新版本号...`);
  console.log(`当前版本: ${currentVersion}`);
  console.log(`更新类型: ${type}`);
  console.log(`新版本: ${newVersion}`);
  
  if (updatePackageVersion(newVersion)) {
    console.log(`\n🎉 版本号更新成功！`);
    console.log(`现在可以执行构建命令了。`);
    
    // 输出新版本号供其他脚本使用
    process.stdout.write(newVersion);
  } else {
    process.exit(1);
  }
}

// 如果直接运行此脚本
if (require.main === module) {
  main();
}

module.exports = { bumpVersion, updatePackageVersion, getCurrentVersion };
